package com.bank.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bank.dto.Result;
import com.bank.entity.DepositType;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 存款类型服务接口
 * 提供存款类型相关的业务逻辑处理
 * 
 * @author 开发团队
 * @version 1.0.0
 * @since 2025-06-19
 */
public interface DepositTypeService {

    /**
     * 新增存款类型
     * 
     * @param depositType 存款类型信息
     * @return 操作结果
     */
    Result<DepositType> addDepositType(DepositType depositType);

    /**
     * 根据存款类型ID删除存款类型
     * 
     * @param savingId 存款类型ID
     * @return 操作结果
     */
    Result<String> deleteDepositType(Integer savingId);

    /**
     * 批量删除存款类型
     * 
     * @param savingIds 存款类型ID列表
     * @return 操作结果
     */
    Result<String> batchDeleteDepositTypes(List<Integer> savingIds);

    /**
     * 修改存款类型信息
     * 
     * @param depositType 存款类型信息
     * @return 操作结果
     */
    Result<DepositType> updateDepositType(DepositType depositType);

    /**
     * 根据存款类型ID查询存款类型信息
     * 
     * @param savingId 存款类型ID
     * @return 存款类型信息
     */
    Result<DepositType> getDepositTypeById(Integer savingId);

    /**
     * 根据存款名称查询存款类型信息（精确查询）
     * 
     * @param savingName 存款名称
     * @return 存款类型信息
     */
    Result<DepositType> getDepositTypeBySavingName(String savingName);

    /**
     * 根据存款名称模糊查询存款类型信息
     * 
     * @param savingName 存款名称
     * @return 存款类型信息列表
     */
    Result<List<DepositType>> getDepositTypesBySavingNameLike(String savingName);

    /**
     * 根据创建时间范围查询存款类型信息（范围查询）
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 存款类型信息列表
     */
    Result<List<DepositType>> getDepositTypesByCreateTimeRange(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 分页查询存款类型信息（支持多条件组合查询）
     * 
     * @param page 分页参数
     * @param savingName 存款名称（可选，支持模糊查询）
     * @param description 存款描述（可选，支持模糊查询）
     * @param startTime 创建开始时间（可选）
     * @param endTime 创建结束时间（可选）
     * @return 分页结果
     */
    Result<IPage<DepositType>> getDepositTypesPage(Page<DepositType> page, String savingName, String description,
                                                  LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 获取所有可用的存款类型（用于下拉选择）
     * 
     * @return 存款类型列表
     */
    Result<List<DepositType>> getAllAvailableDepositTypes();

    /**
     * 检查存款名称是否已存在
     * 
     * @param savingName 存款名称
     * @param excludeSavingId 排除的存款类型ID（用于修改时验证）
     * @return 是否存在
     */
    Result<Boolean> checkSavingNameExists(String savingName, Integer excludeSavingId);

    /**
     * 获取存款类型统计信息
     * 
     * @return 存款类型总数
     */
    Result<Integer> getDepositTypeCount();

    /**
     * 导出存款类型信息到CSV文件
     * 
     * @return CSV文件内容
     */
    Result<String> exportDepositTypesToCSV();

    /**
     * 验证存款类型信息的完整性和合法性
     * 
     * @param depositType 存款类型信息
     * @return 验证结果
     */
    Result<Void> validateDepositTypeInfo(DepositType depositType);
}
